#ifndef __HARDWARE_MOTOR_H
#define __HARDWARE_MOTOR_H

#include "tim.h"
#include "gpio.h"

/* 电机所用引脚定义 ********************/

#define MOTOR_LF_USEDTIM        &htim2
#define MOTOR_LF_USEDCHANNEL    TIM_CHANNEL_1
#define MOTOR_LF_USEDGPIO1      GPIOA
#define MOTOR_LF_USEDGPIO2      GPIOA
#define MOTOR_LF_USEDGPIO1PIN   GPIO_PIN_6
#define MOTOR_LF_USEDGPIO2PIN   GPIO_PIN_7

#define MOTOR_RF_USEDTIM        &htim2
#define MOTOR_RF_USEDCHANNEL    TIM_CHANNEL_2
#define MOTOR_RF_USEDGPIO1      GPIOA
#define MOTOR_RF_USEDGPIO2      GPIOA
#define MOTOR_RF_USEDGPIO1PIN   GPIO_PIN_4
#define MOTOR_RF_USEDGPIO2PIN   GPIO_PIN_5

#define MOTOR_LB_USEDTIM        &htim2
#define MOTOR_LB_USEDCHANNEL    TIM_CHANNEL_3
#define MOTOR_LB_USEDGPIO1      GPIOB
#define MOTOR_LB_USEDGPIO2      GPIOB
#define MOTOR_LB_USEDGPIO1PIN   GPIO_PIN_10
#define MOTOR_LB_USEDGPIO2PIN   GPIO_PIN_11

#define MOTOR_RB_USEDTIM        &htim2
#define MOTOR_RB_USEDCHANNEL    TIM_CHANNEL_4
#define MOTOR_RB_USEDGPIO1      GPIOB
#define MOTOR_RB_USEDGPIO2      GPIOB
#define MOTOR_RB_USEDGPIO1PIN   GPIO_PIN_0
#define MOTOR_RB_USEDGPIO2PIN   GPIO_PIN_1

/******************** 电机所用引脚定义 */

typedef struct
{
    uint32_t OutputPWM;    // Max 9999, Min 0
    // float Velocity;
    int8_t Direction;   // 1: Forward, -1: Backward, 0: Stop

    TIM_HandleTypeDef* usedTIM;
    uint32_t usedChannel;

    GPIO_TypeDef* usedGPIO1;
    GPIO_TypeDef* usedGPIO2;
    uint16_t usedGPIO1Pin;
    uint16_t usedGPIO2Pin;
}Motor_t;

Motor_t* Motor_GetMotorPtr_LF(void);
Motor_t* Motor_GetMotorPtr_RF(void);
Motor_t* Motor_GetMotorPtr_LB(void);
Motor_t* Motor_GetMotorPtr_RB(void);
void Motor_Init(void);
void Motor_SetDriction(Motor_t *wheel, int8_t direction);
void Motor_SetPWM(Motor_t *wheel, uint32_t pwm);
void Motor_Update(void);

#endif // !__HARDWARE_MOTOR_H
